/*
 * Copyright 2009-2010 Nanjing RedOrange ltd (http://www.red-orange.cn)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package redora.db;

import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import redora.exceptions.ConnectException;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Logger;

import static java.util.logging.Level.SEVERE;
import static java.util.logging.Level.WARNING;

public class Connection {

    private static final transient Logger l = Logger.getLogger("redora.db.Connection");

    @NotNull
    public java.sql.Connection con;

    public Connection(@NotNull String schema) throws ConnectException {
        connect(schema);
    }

    void connect(@NotNull String schema) throws ConnectException {
         try {
             con = DriverManager.getConnection(DatabaseFactory.connect(schema), DatabaseFactory.info(schema));
             String autoCommit = DatabaseFactory.getConfiguration().getProperty("database." + schema + ".autoCommit");
             if (StringUtils.isEmpty(autoCommit))
                 autoCommit = DatabaseFactory.getConfiguration().getProperty("database.default.autoCommit");
             con.setAutoCommit("true".equals(autoCommit));
         } catch (SQLException e) {
             throw new ConnectException("Failed to connect to " + DatabaseFactory.connect(schema), e);
        }
    }

    public boolean isConnected() {
        try {
            return !con.isClosed();
        } catch (SQLException e) {
            l.log(WARNING, "Failed isClosed check", e);
        }
        return false;
    }

    public void close() {
        try {
            con.close();
        } catch (SQLException e) {
            l.log(WARNING, "Failed closing connection", e);
        }
    }

    public void reset(@NotNull String schema) {
        close();
        try {
            connect(schema);
        } catch (ConnectException e) {
            l.log(SEVERE, "Swallowing reconnect failure", e);
        }
    }
}
